package fr.afcepf.atod18.restaurants.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import fr.afcepf.atod18.commande.entity.Panier;
import fr.afcepf.atod18.commande.entity.ProduitSelectionne;
import fr.afcepf.atod18.commande.service.IServicePanier;
import fr.afcepf.atod18.commande.web.PanierMB;
import fr.afcepf.atod18.restaurants.entity.Produit;
import fr.afcepf.atod18.restaurants.entity.ProduitsPourPanier;
import fr.afcepf.atod18.restaurants.entity.Restaurant;
import fr.afcepf.atod18.restaurants.service.IServiceCarte;
import fr.afcepf.atod18.restaurants.service.IServiceProduit;
import fr.afcepf.atod18.restaurants.service.IServiceRestaurant;

@ManagedBean(name = "listeProduitsRestauMB")
@SessionScoped
public class ListeProduitsRestauMB {
    private Restaurant restaurantSelectionne;
    private Integer idSelRestaurant = 1;
    private Integer idPrec = 1000000;

    // begin: Add code related to ws
    //private Integer quantite = 0;
    private Integer total = 0;
    // end: Add code related to ws

    @ManagedProperty(value = "#{serviceRestaurant}")
    private IServiceRestaurant serviceRestaurant;

    @ManagedProperty(value = "#{serviceProduit}")
    private IServiceProduit serviceProduit;

    @ManagedProperty(value = "#{servicePanier}")
    private IServicePanier servicePanier;
    
    @ManagedProperty(value = "#{serviceCarte}")
    private IServiceCarte serviceCarte;

    @ManagedProperty(value = "#{panierMB}")
    private PanierMB panierMB;

    private List<Produit> listeProduits;
    private List<ProduitsPourPanier> listeProduitsPanier;
    private ProduitsPourPanier prodEnModif;

    private Map<Integer, Boolean> selectedIds = new HashMap<Integer, Boolean>();
    private List<Produit> listePrdSelected;

    public ListeProduitsRestauMB() {
        super();
        System.out
                .println("===================================================================================================");
        System.out.println("mb liste produit instancie" + this);
        System.out
                .println("===================================================================================================");
    }

    public String doSelection() {
        return "Panier";
    }

    public String doSuite() {
        return "welcome";
    }

    public String getSelectedItems() {
        listePrdSelected = new ArrayList<Produit>();
        Set<ProduitSelectionne> listePrdSel = new HashSet<ProduitSelectionne>();
        double total = 0;
        for (Produit p : listeProduits) {
            System.out.println("Produit : " + p.getNom() + " " + p.getPrix()
                    + " " + selectedIds.get(p.getId()).booleanValue());
            if (selectedIds.get(p.getId()).booleanValue()) {
                listePrdSelected.add(p);
                System.out.println("Produit selectionne : " + p.getNom() + " "
                        + p.getPrix());
                ProduitSelectionne prdSel = new ProduitSelectionne(1, p);
                listePrdSel.add(prdSel);
                total += prdSel.getQuantite() * prdSel.getProduit().getPrix();
                selectedIds.remove(p.getId());
            }
        }
        Panier panier = new Panier(total, listePrdSel);
        servicePanier.ajouter(panier);
//        panierMB.setPanier(panier);
//        panierMB.setIdSelPanier(panier.getId());
//        panierMB.setRestaurantSelectionne(restaurantSelectionne);
        return "Panier";
    }

    public IServiceRestaurant getGestionRestaurant() {
        return serviceRestaurant;
    }

    public void setGestionRestaurant(IServiceRestaurant serviceRestaurant) {
        this.serviceRestaurant = serviceRestaurant;
    }

    public List<Produit> getListeProduits() {
        
        System.out.println("idSelRestaurant= " + idSelRestaurant );
        System.out.println("idPrec= " + idPrec );
        
        if (idSelRestaurant != idPrec) {
            if (idSelRestaurant == 2 || idSelRestaurant == 3 || idSelRestaurant == 5) {
                listeProduits = serviceRestaurant
                        .rechercherProduitsRestaurant(idSelRestaurant);
            } else {
                listeProduits = serviceProduit.rechercherTout();
            }
            idPrec = idSelRestaurant;
        }
        if (listeProduits != null) {
            Collections.sort(listeProduits);
        }
        return listeProduits;
    }

    public void setListeProduits(List<Produit> listeProduits) {
        this.listeProduits = listeProduits;
    }
    
    

    public List<ProduitsPourPanier> getListeProduitsPanier() {
        if (idSelRestaurant != idPrec) {
        	listeProduits = serviceRestaurant
                    .rechercherProduitsRestaurant(idSelRestaurant);      	
            idPrec = idSelRestaurant;
            listeProduitsPanier=new ArrayList<ProduitsPourPanier>();
            for (Produit p:listeProduits){
            	ProduitsPourPanier ppp = new ProduitsPourPanier();
            	ppp.setProd(p);
            	ppp.setQteAAjouter(0);
            	listeProduitsPanier.add(ppp);
            }
        }
		return listeProduitsPanier;
	}

	public void setListeProduitsPanier(List<ProduitsPourPanier> listeProduitsPanier) {
		this.listeProduitsPanier = listeProduitsPanier;
	}
	
	

	public ProduitsPourPanier getProdEnModif() {
		return prodEnModif;
	}

	public void setProdEnModif(ProduitsPourPanier prodEnModif) {
		this.prodEnModif = prodEnModif;
	}

	/**
     * @return the restaurantSelectionne
     */
    public Restaurant getRestaurantSelectionne() {
        return restaurantSelectionne;
    }

    /**
     * @param paramRestaurantSelectionne
     *            the restaurantSelectionne to set
     */
    public void setRestaurantSelectionne(Restaurant paramRestaurantSelectionne) {
        restaurantSelectionne = paramRestaurantSelectionne;
    }

    /**
     * @return the idSelRestaurant
     */
    public Integer getIdSelRestaurant() {
        return idSelRestaurant;
    }

    /**
     * @param paramIdSelRestaurant
     *            the idSelRestaurant to set
     */
    public void setIdSelRestaurant(Integer paramIdSelRestaurant) {
        idSelRestaurant = paramIdSelRestaurant;
    }

    /**
     * @return the idPrec
     */
    public Integer getIdPrec() {
        return idPrec;
    }

    /**
     * @param paramIdPrec
     *            the idPrec to set
     */
    public void setIdPrec(Integer paramIdPrec) {
        idPrec = paramIdPrec;
    }

    /**
     * @return the serviceRestaurant
     */
    public IServiceRestaurant getServiceRestaurant() {
        return serviceRestaurant;
    }

    /**
     * @param paramServiceRestaurant
     *            the serviceRestaurant to set
     */
    public void setServiceRestaurant(IServiceRestaurant paramServiceRestaurant) {
        serviceRestaurant = paramServiceRestaurant;
    }

    /**
     * @return the selectedIds
     */
    public Map<Integer, Boolean> getSelectedIds() {
        return selectedIds;
    }

    /**
     * @param paramSelectedIds
     *            the selectedIds to set
     */
    public void setSelectedIds(Map<Integer, Boolean> paramSelectedIds) {
        selectedIds = paramSelectedIds;
    }

    /**
     * @return the listePrdSelected
     */
    public List<Produit> getListePrdSelected() {
        return listePrdSelected;
    }

    /**
     * @param paramListePrdSelected
     *            the listePrdSelected to set
     */
    public void setListePrdSelected(List<Produit> paramListePrdSelected) {
        listePrdSelected = paramListePrdSelected;
    }

    /**
     * @return the serviceProduit
     */
    public IServiceProduit getServiceProduit() {
        return serviceProduit;
    }

    /**
     * @param paramServiceProduit
     *            the serviceProduit to set
     */
    public void setServiceProduit(IServiceProduit paramServiceProduit) {
        serviceProduit = paramServiceProduit;
    }

    /**
     * @return the servicePanier
     */
    public IServicePanier getServicePanier() {
        return servicePanier;
    }

    /**
     * @param paramServicePanier
     *            the servicePanier to set
     */
    public void setServicePanier(IServicePanier paramServicePanier) {
        servicePanier = paramServicePanier;
    }

    /**
     * @return the panierMB
     */
    public PanierMB getPanierMB() {
        return panierMB;
    }

    /**
     * @param paramPanierMB
     *            the panierMB to set
     */
    public void setPanierMB(PanierMB paramPanierMB) {
        panierMB = paramPanierMB;
    }

    // begin: Add code related to ws

    /**
     * @return the quantite
     */
//    public Integer getQuantite() {
//        return quantite;
//    }

    /**
     * @param paramQuantite
     *            the quantite to set
     */
//    public void setQuantite(Integer paramQuantite) {
//        System.out.println("setQuantite : " + quantite + " ");
//        quantite = paramQuantite;
//    }

    /**
     * @return the total
     */
    public Integer getTotal() {
        return total;
    }

    /**
     * @param paramTotal
     *            the total to set
     */
    public void setTotal(Integer paramTotal) {
        total = paramTotal;
    }
   
    /**
     * @return the serviceCarte
     */
    public IServiceCarte getServiceCarte() {
        return serviceCarte;
    }

    /**
     * @param paramServiceCarte the serviceCarte to set
     */
    public void setServiceCarte(IServiceCarte paramServiceCarte) {
        serviceCarte = paramServiceCarte;
    }

//    public String majQuantite() {
//
//        for (Produit p : listeProduits) {
//            p.setQuantite(quantite);
//        }
//
//        for (Produit p : listeProduits) {
//            System.out.println("Produit : " + p.getNom() + " quantite = "
//                    + p.getQuantite());
//        }
//
//        return null;
//    }
    

    public String doSupprimerProduit() {

        System.out.println("EFFACER");
        
        listePrdSelected = new ArrayList<Produit>();
        Set<ProduitSelectionne> listePrdSel = new HashSet<ProduitSelectionne>();
        double total = 0;
        
        for (Produit p : listeProduits) {
            
            System.out.println("Produit : " + p.getNom() + " " + p.getPrix() + " " + selectedIds.get(p.getId()).booleanValue());
            
            if (selectedIds.get(p.getId()).booleanValue()) {
                
                serviceProduit.supprimerParId(p.getId());

            }
        }

        return "restaurateurGestionProd";

    }

    // end: Add code related to ws
    public void majPrixAPayer (){
    	for (ProduitsPourPanier p:listeProduitsPanier){
    		p.setPrixAPayer(p.getQteAAjouter()*p.getProd().getPrix());
    	}
    }
    
    
    public String doModifierQte() {
        
        listePrdSelected = new ArrayList<Produit>();
        Set<ProduitSelectionne> listePrdSel = new HashSet<ProduitSelectionne>();
        double total = 0;
        
        for (Produit p : listeProduits) {
            System.out.println("Produit : " + p.getNom() + " " + p.getPrix() + " " + p.getId() + " "+ selectedIds.get(p.getId()).booleanValue());
            
            if (selectedIds.get(p.getId()).booleanValue()) {
                
              
                serviceProduit.mettreAJour(p);
                
            }
        }
        
        return "restaurateurGestionProd";
  
    }
}
